﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Roborally.CommonData.GlobaleTypes;
using Roborally.Scheidsrechter;

namespace Roborally.Algoritme_Groep10
{
    public class Tree
    {
        private Algoritme algoritme;

        public Tree(Algoritme Algoritme)
        {
            this.algoritme = Algoritme;
        }

        /// <summary>
        /// In deze methode worden "kinderen", nieuwe bordsituaties, aangemaakt
        /// </summary>
        /// <param name="model">Het binnen gekregen model</param>
        /// <param name="node">De node vanaf waar je wilt kijken</param>
        /// <param name="lijstje">Het lijstje met de nog te behandelen nodes</param>
        /// <returns></returns>
        internal Stack<Node> geefKinderen(IModel model, Node node, Stack<Node> lijstje, SpelerGegevens Speler)
        {
            for (int i = 0; i < node.NogDoenLijst.Count; i++)
            {
                List<IProgramKaart> kLijst = new List<IProgramKaart>();
                List<IProgramKaart> nogtedoenlijst = new List<IProgramKaart>();
                Queue<IProgramKaart> nogLijst = new Queue<IProgramKaart>();
                //geef de route van vader door aan kind
                for (int j = 0; j < node.RouteLijst.Count; j++)
                {
                    kLijst.Add(node.RouteLijst[j]);
                }
                //kopie maken van nogdoenlijst
                foreach (ProgramKaart kt in node.NogDoenLijst)
                {
                    nogtedoenlijst.Add(kt);
                }
               
                Node nieuweNode = new Node();
                
                IProgramKaart huidigeKaart = nogtedoenlijst.ElementAt(i);
                SpelerGegevens nieuwespeler = algoritme.DoVoerZetUit(Speler, huidigeKaart);
                //nieuweNode = scheidsrechter.geefNieuwePlek(model, huidigeKaart, node);
                if (nieuwespeler.Positie.X < 0 || nieuwespeler.Positie.Y < 0)
                {
                    
                }
                else
                {
                    nieuweNode.Positie = nieuwespeler.Positie;
                    nieuweNode.SpRichting = nieuwespeler.Richting;
                    nieuweNode.Diepte = node.Diepte + 1;
                    nieuweNode.RouteLijst = kLijst;
                    nieuweNode.NogDoenLijst = nogtedoenlijst;
                    nieuweNode.RouteLijst.Add(huidigeKaart);
                    nieuweNode.NogDoenLijst.Remove(huidigeKaart);
                    lijstje.Push(nieuweNode);
                }
            }
           
            return lijstje;
        }
    }
}
